数式の画像を作る

30 11月

数式の画像をたくさん作る準備です。まず ubuntu22 にいくつかインストール。synaptic から下記を入れる。

  • nkf
  • texlive-lang-cjk
  • texlive-fonts-recommended
  • texlive-fonts-extra
  • xdvik-ja
  • imagemagick

imagemagick は設定が必要。/etc/ImageMagick-6/policy.xml を編集する。以前に記事を書いたが、バージョンによって記述が異なるようだ。この記述内容には自信がない。

  <!-- disable ghostscript format types -->
  <policy domain="coder" rights="read|write" pattern="PS" />
  <policy domain="coder" rights="read|write" pattern="PS2" />
  <policy domain="coder" rights="read|write" pattern="PS3" />
  <policy domain="coder" rights="read|write" pattern="EPS" />
  <policy domain="coder" rights="read|write" pattern="PDF" />
  <policy domain="coder" rights="none" pattern="XPS" />

この他、php-mbstring を入れる。

以前書いた、php で TeX のソースを画像ファイルにするファイルは以下のようなものである。

<?php

$stamp =  microtime();
list($msec, $sec) = explode(" ", $stamp);

$msec = $msec + 1;
$msec = (string)$msec*1000000;
$msec = substr($msec,1);
$timestamp = $sec.$msec;
$head = "tmp".$timestamp;
$tmp = $head."_log.txt";

$logfile = fopen("$tmp","w");

$tmp='\frac{1}{\sqrt{2}}';

echo "$tmp \n";

fputs($logfile,"$tmp \n");

$texword = $tmp;
$tmp = $head.".tex";

$texfile = fopen("$tmp","w");

$word = mb_convert_encoding($texword, "UTF-8", "auto");

echo "namae = $head, texword = $word \n";

$tmp = <<< end_of_quote
\\documentclass{jarticle}
\\special{papersize=73mm,40mm}
\\setlength{\\hoffset}{-20.0mm}
\\setlength{\\voffset}{-14.9mm}
\\setlength{\\oddsidemargin}{0mm}
\\setlength{\\topmargin}{0mm}
\\setlength{\\headheight}{0mm}
\\setlength{\\headsep}{0mm}
\\setlength{\\textwidth}{72mm}
\\setlength{\\textheight}{13mm}
\\setlength{\\unitlength}{1mm}
\\pagestyle{empty}
\\begin{document}
%\\makeboxを使うと箱を書かない
%\\frameboxを使うと箱を書く
\\noindent
\\makebox(71,13)[l]{{\\Huge \\quad \$ \\displaystyle $word \$ }}
%makeswfp.phpと異なり、上記texソースを\$ \$ で挟む必要がある。
\\end{document}

end_of_quote;

echo $tmp;

fputs($logfile,$tmp);
fputs($texfile,$tmp);
fclose($texfile);

passthru( "nkf --overwrite -W ./$head.tex");

$tmp = passthru( "platex ./$head.tex");
passthru( "dvipdfmx -f ./ipa.map ./$head.dvi");

passthru( "dvips -E -Ppdf ./$head.dvi -o ./$head.eps");
passthru( "convert ./$head.eps ./$head.png");

fputs($logfile,"$tmp \n");
fclose($logfile);

if (file_exists("./$head.png")) {
	passthru( "rm $head.aux; rm $head.dvi; rm $head.log; rm $head.tex; rm $head\_log.txt");
	echo 'this$$'.$head.'$$that'."\n";
} else {
	echo 'this$$error$$that'."\n";
}
?>

ipa.map というファイルが必要であるが、それは下記のような内容のテキストファイルである。

rml   H ipam.ttf
gbm   H ipag.ttf
rmlv  V ipam.ttf
gbmv  V ipag.ttf

これを実行したところ、数式の画像ファイルが得られた。あとは、Python に書き直すぐらいか。

Python にしてみました。

# coding: utf-8

import sys, os
sys.path.append(os.pardir)  # 親ディレクトリのファイルをインポートするための設定
sys.path.append('..')


import time


timestamp = int(time.time()*1000000)

head = "tmp" + str(timestamp)

#head = 'tmp'

print(head)

logfile = open(head + '.log','w')

logfile.write( head + '\n\n')

texWord = '\\frac{1}{\\sqrt{2}}'
#texWord = repr('\frac{1}{\sqrt{2}}')

logfile.write( 'TeX : ' + texWord + '\n\n')

print('texWord : ' + texWord)

texfile = open(head + '.tex','w')

tmpString = '''\\documentclass{{jarticle}}
\\special{{papersize=73mm,40mm}}
\\setlength{{\\hoffset}}{{-20.0mm}}
\\setlength{{\\voffset}}{{-14.9mm}}
\\setlength{{\\oddsidemargin}}{{0mm}}
\\setlength{{\\topmargin}}{{0mm}}
\\setlength{{\\headheight}}{{0mm}}
\\setlength{{\\headsep}}{{0mm}}
\\setlength{{\\textwidth}}{{72mm}}
\\setlength{{\\textheight}}{{13mm}}
\\setlength{{\\unitlength}}{{1mm}}
\\pagestyle{{empty}}
\\begin{{document}}
%\\makeboxを使うと箱を書かない
%\\frameboxを使うと箱を書く
\\noindent
\\makebox(71,13)[l]{{{{\\Huge \\quad $ \\displaystyle {word} $ }}}}
%makeswfp.phpと異なり、上記texソースを$ $ で挟む必要がある。
\\end{{document}}

'''.format(word = texWord)

texfile.write(tmpString)

texfile.close()


tmpCmd = 'platex ./' + head + '.tex > /dev/null'
print(tmpCmd)
os.system(tmpCmd)

#tmpCmd = 'dvipdfmx -f ./ipa.map ./' + head + '.dvi'
#print(tmpCmd)
#os.system(tmpCmd)


# 標準エラー出力などを捨てる

tmpCmd = 'dvips -E -Ppdf ./' + head + '.dvi -o ./' + head + '.eps 2>> /dev/null'
print(tmpCmd)
os.system(tmpCmd)

tmpCmd = 'convert ./' + head + '.eps ./' + head + '.png 2>> /dev/null'
print(tmpCmd)
os.system(tmpCmd)


logfile.close()

他のやり方で 画像を作ってみます。synaptic から dvipng のインストールが必要でした。

%reset -f

import sys
#from sympy import *
import sympy
import random
from sympy import I, pi, E

expr = sympy.sympify('x/y', evaluate=False)

sympy.preview(expr, viewer='file', filename='./texImage/tex.png', euler=False,\
              dvioptions=["-T", "tight", "-z", "0", "--truecolor", "-D 600"])

1行が長いので改行やインデントがむちゃくちゃになっています。preview に sympy の式を与えています。TeX のソースでも良いようですが、書き方が異なります(参考サイト)。

画像ができました。